/* 动态数组*/

#include <stdlib.h>
#include <stdio.h>

typedef void* arrayType; // 动态数组存储的数据类型

typedef struct DynamicArray {
    int size; // 逻辑大小
    int capacity;
    arrayType *array;
} DynamicArray;

// 创建多维数组的函数实现(未用)
void* createArray(int dimensions, int* sizes, size_t sizeOfType) {
    // 动态分配一维数组
    void* arr = malloc(sizeOfType * sizes[0]);
    if (dimensions > 1) {
        // 创建下一维数组
        for (int i = 0; i < sizes[0]; i++) {
            ((void**)arr)[i] = createArray(dimensions - 1, sizes + 1, sizeOfType);
        }
    }
    return arr;
}

/**
 * @brief 创建指定类型的“二维数组”
 * @param sizeOfType 数组元素类型大小
 * @return 动态数组指针
*/
DynamicArray* createDynamicArray(size_t sizeOfType) {
    DynamicArray* p = (DynamicArray*)malloc(sizeof(DynamicArray));
    p->size = 0;
    p->capacity = 8;
    p->array = (arrayType*)malloc(p->capacity * sizeof(sizeOfType));

}

/**
 * @brief 判断动态数组是否需要扩容,若需要则进行扩容
*/
void ifExpand(DynamicArray* p) {
    if (p->size == p->capacity) {
        p->capacity += p->capacity >> 1;
        arrayType* newArray = (arrayType*) realloc(p->array, p->capacity * sizeof(arrayType));
        p->array = newArray;
    }
}

/**
 * @brief 往动态数组添加元素(增)
*/
void appendToDynamicArray(DynamicArray* p, arrayType e) {
    // 容量检查
    ifExpand(p);
    p->array[p->size] = e;
    p->size++;
}

/**
 * @brief 往动态数组删除元素(删)
*/
arrayType removeToDynamicArray(DynamicArray* p, int index) {
    arrayType temp = p->array[index];
    for (int i = index + 1; i < p ->size; i++) {
        p->array[i - 1] = p->array[i];
    }
    p->size--;
    return temp;
}

/**
 * @brief 往动态数组替换元素(改)
*/
void replaceToDynamicArray(DynamicArray* p, int index, arrayType e) {
    p->array[index] = e;
}

/**
 * @brief 往动态数组查找元素(查)
*/
arrayType getInDynamicArray(DynamicArray* p, int index) {
    return p->array[index];
}

void swapToDynamicArray(DynamicArray* p, int a, int b) {
    void* temp = getInDynamicArray(p, a);
    replaceToDynamicArray(p, a, getInDynamicArray(p, b));
    replaceToDynamicArray(p, b, temp);
}

// void main() {
//     DynamicArray* p = createDynamicArray(sizeof(int*));
//     int a = 5;
//     int* a_ = &a;
//     int b = 8;
//     int* b_ = &b;
//     appendToDynamicArray(p, a_);
//     appendToDynamicArray(p, b_);
//     swapToDynamicArray(p, 0, 1);
//     int* z = getInDynamicArray(p, 0);
//     printf("%d", *z);

// }